package com.zjsru.plan2023.oneday.oneDay202302;

import java.util.HashMap;
import java.util.Map;

/**
 * @Author: CookLee
 * @Date: 2023/2/1
 * 解密消息
 * 使用 key 中 26 个英文小写字母第一次出现的顺序作为替换表中的字母 顺序 。
 *
 * 输入：key = "the quick brown fox jumps over the lazy dog", message = "vkbs bs t suepuv"
 * 输出："this is a secret"
 * 解释：对照表如上图所示。
 * 提取 "the quick brown fox jumps over the lazy dog" 中每个字母的首次出现可以得到替换表。
 * （'h' -> 'a'、'a' -> 'b'、'p' -> 'c'、'y' -> 'd'、'b' -> 'e'、'o' -> 'f'）。
 *
 * 输入：key = "eljuxhpwnyrdgtqkviszcfmabo", message = "zwx hnfx lqantp mnoeius ycgk vcnjrdb"
 * 输出："the five boxing wizards jump quickly"
 * 解释：对照表如上图所示。
 * 提取 "eljuxhpwnyrdgtqkviszcfmabo" 中每个字母的首次出现可以得到替换表。
 */
public class DecodeMessage {
    
    private final static char CHAR_INIT_A = 'a';
    
    /**
     * 解码信息 ： 哈希map存储26个字母对应的解码值
     *
     * @param key     关键
     * @param message 消息
     * @return {@link String}
     */
    public String decodeMessage(String key, String message) {
        Map<Character, Character> map = new HashMap<>(26);
        int tag = 0;
        for (int i = 0; i < key.length(); i++) {
            char c = key.charAt(i);
            // 不为空格，字母不在map中才添加新的字母密文
            if (c != ' ' && !map.containsKey(c)) {
                map.putIfAbsent(c, (char) (CHAR_INIT_A + tag));
                tag++;
            }
        }
        StringBuilder input = new StringBuilder();
        for (int i = 0; i < message.length(); i++) {
            char c = message.charAt(i);
            if (c == ' ') {
                input.append(c);
            } else {
                input.append(map.get(c));
            }
        }
        return input.toString();
    }
    
    public static void main(String[] args) {
        DecodeMessage decodeMessage = new DecodeMessage();
        String key = "the quick brown fox jumps over the lazy dog";
        String message = "vkbs bs t suepuv";
        System.out.println(decodeMessage.decodeMessage(key, message));
    }
}
